package com.rpframework.website.device.service;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.rpframework.core.BaseService;
import com.rpframework.utils.NumberUtils;
import com.rpframework.utils.Pager;
import com.rpframework.website.device.dao.IGoodsStockRecordDao;
import com.rpframework.website.device.domain.Goods;
import com.rpframework.website.device.domain.GoodsStock;
import com.rpframework.website.device.domain.GoodsStockRecord;
import com.rpframework.website.device.util.HConstants;

@Service
public class GoodsStockRecordService extends BaseService{
	public @Resource IGoodsStockRecordDao iDao;
	@Resource GoodsService goodsService;
	@Resource GoodsStockService goodsStockService;
	
	public Pager<GoodsStockRecord> getPager(Pager<GoodsStockRecord> pager) {
		long startTime = System.currentTimeMillis();
		List<GoodsStockRecord> list = iDao.doPager(this.packageMyBatisParam(pager));
		pager.setItemList(list);
		pager.setCostTime(System.currentTimeMillis() - startTime);
		return pager;
	}
	/**
	 * 修改状态
	 * @param id
	 * @return
	 * @time 2016年4月1日 上午10:16:37
	 */
	
	public boolean doUpdateState(Integer id) {
		if(NumberUtils.isValid(id)){
			GoodsStockRecord t = iDao.select(id);
			if(t.getState() == HConstants.EntityState.STATE_NORMAL){
				t.setState(HConstants.EntityState.STATE_DISABLE);
			}else{
				t.setState(HConstants.EntityState.STATE_NORMAL);
			}
			return iDao.update(t);
		}
		return false;
	}
	/**
	 * 小区入库 平台入库
	 * @param t
	 * @return
	 */
	public boolean doSaveOrUpdate(GoodsStockRecord t) {
		Goods goods = goodsService.select(t.getGoodsId());
		if(goods == null)throw new IllegalArgumentException("无效的商品!");
		if(NumberUtils.isValid(t.getId())){
			GoodsStockRecord db = iDao.select(t.getId());//查原来的数量
			if(db!=null){
				GoodsStock gs = goodsStockService.searchStock(t.getGoodsId(), 0);//要还回平台商品
				if(db.getAmount() > t.getAmount()){
					gs.setAmount(gs.getAmount()+db.getAmount()-t.getAmount());//平台原库存 +（ 物业记录原库存 - 物业修改后库存）
					goodsStockService.update(gs);
				}else{
					gs.setAmount(gs.getAmount()-(t.getAmount()-db.getAmount()));//平台原库存 -（  物业修改后库存 -物业记录原库存 ）
					goodsStockService.update(gs);
				} 				
			}
			return iDao.update(t);
		}else{
			if(t.getRelativeId() == null ){//表示是平台的入库
				t.setGoodsOldPrice(goods.getOldPrice());
				t.setGoodsDisPrice(goods.getDisPrice());
				t.setGoodsName(goods.getName());
				t.setCreateTime(System.currentTimeMillis()/1000);
				t.setState(HConstants.EntityState.STATE_NORMAL);//平台是不需要确认的
				t.setRelativeId(0);
				boolean flag = iDao.insert(t);
				if(flag){//生成平台入库记录 同时要加上入库数量的库存
					GoodsStock gt = goodsStockService.searchStock(goods.getId(), 0);//查询平台这件商品的库存
					if(gt!= null){//如果以前有添加过这件商品
						gt.setAmount(gt.getAmount()+t.getAmount());//直接更改总数
						gt.setModifyTime(System.currentTimeMillis()/1000);
						return	goodsStockService.update(gt);//更改库存
					}else{
						gt = new GoodsStock();
						gt.setAmount(t.getAmount());
						gt.setGoodsId(goods.getId());
						gt.setGoodsName(goods.getName());
						gt.setGoodsOldPrice(goods.getOldPrice());
						gt.setGoodsDisPrice(goods.getDisPrice());
						gt.setCreateTime(System.currentTimeMillis()/1000);
						gt.setRelativeId(0);//平台入库
						gt.setGoodsUrlList(goods.getUrlList());
						return	goodsStockService.insert(gt);//新增库存
					}
				}
			}
			//生成小区入库记录  同时要在确认的时候  加上入库数量  的库存 但是这个货有没有配出去未确认的时候，这条记录的数量已经从平台减掉了。
			//生成小区入库记录 减去平台库存
			t.setGoodsOldPrice(goods.getOldPrice());
			t.setGoodsDisPrice(goods.getDisPrice());
			t.setGoodsName(goods.getName());
			t.setCreateTime(System.currentTimeMillis()/1000);
			t.setState(HConstants.EntityState.STATE_DISABLE);
			GoodsStock gt = goodsStockService.searchStock(goods.getId(), 0);//查询平台这件商品的库存
			if(gt!=null && gt.getAmount() >= t.getAmount()){// 小区入库其实 是要在平台减去商品总数
				gt.setAmount(gt.getAmount() - t.getAmount());
				gt.setModifyTime(System.currentTimeMillis()/1000);
				boolean flag =goodsStockService.update(gt);//更改库存 是更改了平台的库存 这时候小区的库存还未加上去，要等确认之后才加
				if(flag) return iDao.insert(t);
			}
			return false;
		}
	}
}
